-- CA11D010.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--      See CA11D013.AM
--
-- TEST DESCRIPTION:
--      See CA11D013.AM
--
-- TEST FILES:
--      The following files comprise this test:
--
--         FA11D00.A
--      => CA11D010.A
--         CA11D011.A
--         CA11D012.A
--         CA11D013.AM
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      26 Apr 96   SAIC    ACVC 2.1: Modified prologue.
--
--!

-- Child package of FA11D00.

package FA11D00.CA11D010 is     -- Add_Subtract_Complex

   procedure Add (Left, Right : in     Complex_Type;   -- Add two complex
                  C           :    out Complex_Type);  -- numbers.

   function Subtract (Left, Right : Complex_Type)      -- Subtract two 
     return Complex_Type;                              -- complex numbers.
                                                
                                                       
                                                       
end FA11D00.CA11D010;     -- Add_Subtract_Complex

--=======================================================================--

with Report;

package body FA11D00.CA11D010 is     -- Add_Subtract_Complex

   procedure Add (Left, Right : in Complex_Type;
                  C           :    out Complex_Type) is
   begin
      -- Zero is declared in parent package.

      if Left.Real < Zero.Real or else Right.Real < Zero.Real
        or else Left.Imag < Zero.Imag or else Right.Imag < Zero.Imag then
          raise Add_Error;     -- Reference to exception in parent package.
          Report.Failed ("Program control not transferred by raise in " &
                         "procedure Add");
      else
         C.Real := (Left.Real + Right.Real);
         C.Imag := (Left.Imag + Right.Imag);
      end if;

   exception
      when Add_Error => 
         TC_Handled_In_Child_Pkg_Proc := true;
         C := Check_Value;           -- Reference to object in parent package.
         raise;     -- Reraise the Add_Error exception in the subtest.
         Report.Failed ("Exception not reraised in handler");

      when others    =>
         Report.Failed ("Unexpected exception raised in Add");

   end Add;
   -----------------------------------------------------------
   function Subtract (Left, Right : Complex_Type) 
     return Complex_Type is
   begin
      -- Zero is declared in parent package.
      if Left.Real < Zero.Real or Right.Real < Zero.Real
        or Left.Imag < Zero.Imag or Right.Imag < Zero.Imag then
          raise Subtract_Error;    -- Reference to exception in parent package. 
          Report.Failed ("Program control not transferred by raise in " &
                         "function Subtract");
      else
         return ( Real => (Left.Real - Right.Real),
                  Imag => (Left.Imag - Right.Imag) );
      end if;

   exception
      when Subtract_Error => 
         Report.Comment ("Exception is properly handled in Subtract");
         TC_Handled_In_Child_Pkg_Func := true;
         return Check_Value;

      when others         =>
         Report.Failed ("Unexpected exception raised in Subtract");

   end Subtract;

end FA11D00.CA11D010;     -- Add_Subtract_Complex
